package com.xing.snake;

import javafx.scene.input.KeyCode;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanel extends JPanel implements KeyListener ,ActionListener {
    //设置初始蛇的身体长度
    int length;
    int[] snakeX = new int[600];//蛇的x轴
    int[] snakeY = new int[500];//蛇的y轴
    //定义蛇是否运动
    boolean isStart = false;
    //控制蛇运动的方向
    String fx = "R";//R：右 ，L:左，U:上，D:下
    //设置定时器
    Timer timer = new Timer(100, (ActionListener) this);
    //定义食物的坐标
    int foodX;
    int foodY;
    //记录积分
    int score;
    //判断游戏是否结束
    boolean isFile = false;
    Random random = new Random();//生成随机数
    //使用构造方法将初始化方法调用
    public GamePanel(){
        init();
        this.setFocusable(true);//获取键盘的监听
        this.addKeyListener(this);//添加加载Listener的类
        //让时间动起来
        timer.start();
    }
    //将蛇初始化
    public void init(){
        length =3 ;//蛇的初始化长度为3
        snakeX[0] =100; snakeY[0] =100;//蛇的头部坐标为100
        snakeX[1] = 75; snakeY[1] =100;//蛇的身体为75
        snakeX[2] = 50; snakeY[2] =100;//蛇的身体为50
        fx="R";
        //生成食物随机坐标
        foodX = 25+25*random.nextInt(34);
        foodY = 25 +25 * random.nextInt(24);
        //初始化积分
        score=0;
    }


    //控制画图 ,画板
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏
        this.setBackground(Color.WHITE);//设置背景颜色
        //绘制头部的广告栏
      //  Data.header.paintIcon(this,g,25,11);

        //绘制游戏区域
        g.fillRect(25,25,850,850);

        if (fx.equals("R")){
            //绘制蛇的头部往右
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("L")){
            //绘制蛇的头部往左
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("U")){
            //控制蛇的头部忘上
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("D")){
            //控制蛇的头部往下
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }

        //绘制蛇的头部
       // Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        //绘制蛇的身体
        for (int i = 1 ;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);//蛇的长度通过length控制
        }
        //游戏提示:是否开始
        if (isStart==false){
            //画一个文字:游戏未开始
            g.setColor(Color.WHITE);//设置文字颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式
            g.drawString("按下空格游戏开始",300,300);
        }
        if (isFile){
            g.setColor(Color.RED);//设置文字颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式
            g.drawString("游戏结束请按下空格重新开始",200,300);
        }
        //添加事物的坐标
        Data.food.paintIcon(this,g,foodX,foodY);

        //设置积分的字体样式
        g.setColor(Color.BLUE);
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("长度:"+length,750,45);
        g.drawString("积分:"+score,750,75);

    }
    //设置键盘监听
    @Override
    public void keyPressed(KeyEvent e) {
        //获取按下的键盘是哪一个键
        int keyCode = e.getKeyCode();//判断游戏的开始与结束
        if (keyCode==KeyEvent.VK_SPACE){
            if (isFile){
                isFile=false;
                init();
            }else {
                isStart=!isStart;
            }
            repaint();//刷新游戏
        }
        //控制小蛇走向
        if (keyCode==KeyEvent.VK_LEFT){
            fx = "L";
        }else if (keyCode == KeyEvent.VK_RIGHT){
            fx="R";
        }else if (keyCode == KeyEvent.VK_UP){
            fx="U";
        }else if (keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }
    }
    //监听时间操作执行定时器
    @Override
    public void actionPerformed(ActionEvent e) {
        //如果游戏处于开始状态,并且游戏没有失败
        if (isStart && isFile==false){

            //让蛇的身体跟随头部移动
            for (int i = length-1;i>0 ;i--){
                snakeX[i]= snakeX[i-1];
                snakeY[i]= snakeY[i-1];
            }
            //那就让蛇右移动
            if (fx.equals("R")){
                snakeX[0] = snakeX[0]+25;
                //判断边界值
                if (snakeX[0]>850){
                    snakeX[0]=25;
                }
            //入果键盘输入为L则向左移动
            }else if (fx.equals("L")){
                snakeX[0] = snakeX[0]-25;
                if (snakeX[0]<25){
                    snakeX[0]=850;
                }
                //向上
            }else if (fx.equals("U")){
                snakeY[0]=snakeY[0]-25;
                if (snakeY[0]<25){
                    snakeY[0]=800;
                }
                //向下
            }else if (fx.equals("D")){
                snakeY[0] = snakeY[0]+25;
                if (snakeY[0]>800){
                    snakeY[0]=25;
                }
            }
            //监听小蛇头部的坐标和食物的坐标是否重合
            if (snakeX[0]==foodX && snakeY[0]==foodY){
                //长度加1
                length++;
                //积分加10
                score+=10;
                //重新生成食物
                //生成食物随机坐标
                foodX = 25+25*random.nextInt(34);
                foodY = 25 +25 * random.nextInt(24);
            }
            //判断游戏是否失败
            for (int i = 1; i <length ; i++) {
                if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                    isFile=true;
                }
            }
            //刷新界面
            repaint();
        }
        timer.start();//让时间动起来
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    @Override
    public void keyReleased(KeyEvent e) {

    }


}
